我們先來探討這件事背後的目的:
綜合上述三點目的看來,
簡單來說,Treble 的意義就是將先前最礙眼的 HAL 大翻修,
Android 8.0 Project Treble 將所有 OEM 自訂的部份,
和 Android OS 原生程式碼獨立出來。
所以在 Treble 出現之前,vendor 區塊和 Android Framework 是綁在一起的。
編譯的時候會將 HAL 和 Framework 一起產生出 system.img 來更新:
Treble 出現之後,所有 vendor 自定義的區塊都可以單獨更新,
產生 vendor.img 放在裝置上獨立的 vendor 分區中,切得乾乾淨淨的。
更扯的是假如修改一個 AOSP ROM 後,
這個 ROM 可刷到目前支援 Treble 的任何一個裝置。
只差在某些硬體元件上的差異,但系統卻可以運作正常,
為什麼呢?這都要多虧系統耦合性大幅降低的關係。
正所謂亂世出英雄,分久必合、合久必分啊!
在 Android 8.0 之前,HAL 是一個一個的 .so 函式庫,
通过 dlopen
来進行開啟,和 framework 位於同一個 IPC 進程中。
現在為了舊版能順利地更新到 Android 8.0 以上,
Android 設定了 Passthrough 和 Binderized 模式。
對於 Android 8.0 之前的版本,如圖 1.
舊版升級到 Android 8.0 版本的過程,如圖 2. 圖 3.
直接在 Android 8.0 之後的版本開發,如圖 4.
Passthrough:兼容舊版的 HAL 模式 (同一個進程)
Binderized:用 Binder 方式來進行 IPC (不同進程: 多了 HW Service Process)
Here comes Treble: A modular base for Android